#include "matriz.h"

#define RUNTEST(t,d) { cerr << endl << "Corriendo test " << #t << ": " << #d << endl; t(); cerr << "Terminado test " << #t << " OK!" << endl << endl; }
#define dim 5


void test0() {
    // la copia de una matriz es independiente de otra.
    Matriz m(dim);
    Matriz n(m);
    n.setPos(0,0,2);
    assert( n(0,0) != m(0,0) );
    // el operador asignacion genera matrices independientes
    Matriz o = n;
    o.setPos(0,0,3);
    assert( n(0,0) != o(0,0) );
    // testeando memoria
    Matriz *dinamica = new Matriz(10);
    delete dinamica;
}

void test1(){
	Matriz m(dim);
	Matriz n(dim);
	Matriz res(dim);
	for(int i=0; i<dim; i++) {
		for(int j=0;j<dim;j++) {
			double mij = rand()%11+1;
			double nij = rand()%11+1;
			m.setPos(i,j ,mij);
			n.setPos(i,j ,nij);
			res.setPos(i,j,mij+nij);
		}
	}
	Matriz k = m+n;
	assert(res == k);
}


void test2(){
	Matriz m(dim);
	Matriz n(dim);
	Matriz res(dim);
	for(int i=0;i<dim;i++) {
		for(int j=0;j<dim;j++) {
			double mij = rand()%11+1;
			double nij = rand()%11+1;
			m.setPos(i, j, mij);
			n.setPos(i, j, nij);
			res.setPos(i, j, mij - nij);
		}
	}
	Matriz k = m-n;
	assert( res == k);
}

void test3(){
	Matriz m(dim);
	Matriz res(dim);
	double num= rand()%7+1;
	for(int i=0;i<dim;i++){
		for(int j=0;j<dim;j++){
			double mij = rand()%11+1;
			m.setPos(i,j ,mij);
			res.setPos(i, j, num*mij);
		}
	}
	Matriz k = num*m;
	assert(res == k);
}

void test4(){
	Matriz m(dim);
	Matriz n(dim);
	Matriz res(dim);
	for(int i=0;i<dim;i++) {
		for(int j=0;j<dim;j++) {
			m.setPos(i,j ,rand()%11+1);
			n.setPos(i,j ,rand()%11+1);
		}
	}
	for(unsigned int i = 0; i < m.size(); i++){
		for(unsigned int j = 0; j < n.size(); j++){
			double temp = 0;
			for(unsigned int k = 0; k < n.size(); k++){
				temp += m(i,k) * n(k,j);
			}
			res.setPos(i, j, temp);
		}
	}
}

void test5() {
	Matriz m(dim);
	for(int i=0;i<dim;i++) {
		for(int j=0;j<dim;j++) {
			m.setPos(i,j ,rand()%(23+j)+1);
		}
	}
	cout << "MATRIZ M: " << endl;
	cout << m;
	double a[dim];
	cout << "B es: [";
	for(int x = 0; x < dim; x++){
		if(x != 0)
			cout << ", ";
		a[x] = rand()%17;
		cout << a[x];
	}
	cout << "]"<<endl;
	double b[dim];
	if(m.resolver(a,b))
		cout << "RESOLVIO!" << endl;
	else
		cout << "NO RESOLVIO :S"<< endl;
}
int main(){
    srand(time(NULL));
    RUNTEST(test0, Probando Constructores y asignacion);
    RUNTEST(test1, Probando la suma);
    RUNTEST(test2, Probando la resta);
    RUNTEST(test3, Probando multiplicacion escalar);
    RUNTEST(test4, Probando multiplicacion con matriz);
    RUNTEST(test5, Resolviendo ecuacion);
    return 0;
}
